package com.ruoyi.web.controller.system.fuw.wx;

import java.util.List;
import java.util.Set;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.fuw.domain.FuwPerson;
import com.ruoyi.fuw.service.IFuwPersonService;
import com.ruoyi.web.controller.util.WxaLogin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.system.service.ISysMenuService;

/**
 * 微信登录验证
 *
 * @author ruoyi
 */
@RestController
public class WxSysLoginController
{
    @Autowired
    private SysLoginService loginService;

    @Autowired
    private ISysMenuService menuService;

    @Autowired
    private IFuwPersonService iFuwPersonService;


    /**
     * 小程序登录
     *
     * @param appId 小程序的appId
     * @param code 小程序wx.login返回的临时凭证
     * @return
     */
    @GetMapping("/api/wx/login")
    public AjaxResult login(@RequestParam("appId") String appId,
                            @RequestParam("code") String code,
                            @RequestParam("appSecret") String appSecret,
                            String username,
                            String face,
                            String gender)
    {
        AjaxResult ajax = AjaxResult.success();
        String _prefix = "【小程序登录】";
        System.out.println(_prefix + "appId：" + appId + ", code：" + code + ", appSecret：" + appSecret);
        try
        {
            if (StringUtils.isEmpty(appId))
            {
                return ajax.error("appId为空");
            }
            // 用户登录凭证（有效期五分钟）
            if (StringUtils.isEmpty(code))
            {
                return ajax.error("登录凭证不能为空");
            }
            WxaLogin wxaLogin = new WxaLogin();
            String result = wxaLogin.getOpenIdByCode(appId, appSecret, code);
            System.out.println(_prefix + "微信根据code获取用户信息结果：" + result);
            JSONObject code2SessionRes = JSON.parseObject(result);
            String openId = code2SessionRes.getString("openid");
            String sessionKey = code2SessionRes.getString("session_key");

            String result2 = wxaLogin.getAccessToken(appId, appSecret);
            System.out.println(_prefix + "微信根据code获取用户信息结果：" + result2);
            JSONObject code2SessionRes2 = JSON.parseObject(result2);
            String accessToken = code2SessionRes2.getString("access_token");

            if (StringUtils.isEmpty(openId))
            {
                return ajax.error("登录失败，无效的登录凭证");
            }
            JSONObject res = new JSONObject();

            // 获取权限 微信用户的角色为 person
            Set<String> permissions = menuService.selectMenuPermsByRoleId("person");

            // 生成令牌
            String token = loginService.wxLogin(openId, sessionKey, permissions);
            res.put("token", token);
            res.put("openId", openId);
            res.put("sessionKey", sessionKey);
            res.put("accessToken", accessToken);
            System.out.println(_prefix + "生成的token：" + token);

            // 查询数据库是否存在 该openId（peronId）的用户
            FuwPerson person = new Person();
            Boolean personBool = iFuwPersonService.selectFuwPersonByPersonId(openId)==null?true:false;
            if(personBool){ // 不存在该openId的用户
                // 新增该用户信息
                person.setPersonId(openId);
                // 默认别名
                person.setPersonUname("游客");
                // 默认性别
                person.setPersonGender(1);
                // 默认签名
                person.setPersonUtext("这个人很懒，什么都没有写！");
                // 查询目前存在的用户数据条数
                List<FuwPerson> fuwPeople = iFuwPersonService.selectFuwPersonList(null);
                // 默认姓名
                person.setPersonName("游客" + fuwPeople.size());
                // 默认头像
                person.setPersonUphoto("http://localhost/dev-api/profile/upload/2021/10/11/e6b17d7f-acf1-448e-9dc1-c94f64467f29.jpg");
                // 新增
                iFuwPersonService.insertFuwPerson(person);
            }else{
                // 更新用户信息
                // 默认别名
                person.setPersonUname(username);
                // 默认性别
                person.setPersonGender(Integer.valueOf(gender));
                // 默认签名
                person.setPersonUtext("这个人很懒，什么都没有写！");
                // 默认姓名
                person.setPersonName(username);
                // 默认头像
                person.setPersonUphoto(face);
                // 新增
                iFuwPersonService.updateFuwPerson(person);
            }
            // 存放用户信息到res中
            res.put("person", person);

            return ajax.success("data", res);
        }
        catch (Exception e)
        {
            String msg = "接口异常";
            if (StringUtils.isNotEmpty(e.getMessage()))
            {
                msg = e.getMessage();
            }
            System.out.println(_prefix + "接口发生异常：" + e);
            return ajax.error(msg);
        }
    }

}
